package net.yihang.exercise;

import net.yihang.entity.Person;
import net.yihang.exception.BizException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 练习1
 * <p>考察知识点：集合</p>
 */
public class Exercise1 {
    
    private static final Logger log = LoggerFactory.getLogger(Exercise1.class);

    public static void main(String[] args) {
        log.debug("功能1==========读取文件中数据至List<Person>集合：");
        List<Person> list = readPersonList();
        log.debug("共有武将：" + list.size() + "名");//正确结果为：474
        if (list.size() > 0) {
            log.debug("第一名武将名为：" + list.get(0).getName());//正确结果为：阿会喃
            log.debug("最后一名武将名为：" + list.get(list.size() - 1).getName());//正确结果为：刘氏
        }

        log.debug("功能2==========武力最高的三名武将：");
        List<Person> top3 = top3Force(list);
        if (top3 != null) {
            for (Person person : top3) {
                log.debug(person.toString());
            } // 正确结果为：吕布，张飞，关羽
        }

        log.debug("功能3==========武力排名前3的武将：");
        List<Person> top3Rank = top3ForceRank(list);
        if (top3Rank != null) {
            for (Person person : top3Rank) {
                log.debug(person.toString());
            }
        }
        // 正确结果为：吕布，张飞，关羽，马超

        log.debug("功能4==========按所在地分组武将，并显示平原出身的武将有哪些");
        Map<String, List<Person>> map = groupByLocation(list);
        // 正确结果为：40个地区（包括一个""地区），平原的武将数量是5个
        if (map != null) {
            log.debug("共有地区：" + map.size() + "个");
            log.debug("其中平原地区的武将有：");
            List<Person> pingyuanList = map.get("平原");
            for (Person person : pingyuanList) {
                log.debug(person.toString());
            }
        }

        log.debug("功能5==========统计男女武将比例");
        log.debug("男女比例约为" + ratio(list) + ":1");
        // 正确答案是：14:1

        log.debug("功能6==========统计各个年龄段武将");
        Map<String, List<Person>> ageRangeRatio = ageRangeRatio(list);
        if (ageRangeRatio != null) {
            ageRangeRatio.forEach((age, personList) -> {
                log.debug(age);
                log.debug("\t" + personList.stream().map(p -> p.getName()).collect(Collectors.joining(",")));
            });
        }

        log.debug("功能7==========统计各个年龄段男女武将比例");
        Map<String, Map<String, List<Person>>> ageRangeSexRatio = ageRangeSexRatio(list);
        if (ageRangeSexRatio != null) {
            ageRangeSexRatio.forEach((age, v) -> {
                log.debug(age + "\t男:女为\t" + v.getOrDefault("男", Collections.emptyList()).size() + ":" + v.getOrDefault("女", Collections.emptyList()).size());
            });
        }

        log.debug("功能8==========统计平均年龄");
        DecimalFormat df = new DecimalFormat("0.0");
        log.debug("平均年龄是：" + df.format(avgAge(list)));
        // 正确答案是：50.0

        log.debug("功能9==========统计最长寿的地区");
        String max = maxAvgAgeLocation(list);
        log.debug("最长寿的地区是：" + max);
        // 正确答案是：上庸

    }

    private static Map<String, List<Person>> ageRangeRatio(List<Person> list) {
        return null;
    }

    private static Map<String, Map<String, List<Person>>> ageRangeSexRatio(List<Person> list) {
        return null;
    }

    private static String maxAvgAgeLocation(List<Person> list) {
        return null;
    }

    private static double avgAge(List<Person> list) {
        return 0.0;
    }

    private static int ratio(List<Person> list) {
        return 0;
    }

    private static List<Person> top3Force(List<Person> list) {
        return null;
    }

    private static List<Person> top3ForceRank(List<Person> list) {
        return null;
    }

    private static Map<String, List<Person>> groupByLocation(List<Person> list) {
        return null;
    }

    public static List<Person> readPersonList() {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("output.txt"))))) {
            // list集合, 用来存储结果, 内含多个Person对象
            List<Person> list = new ArrayList<>();
            // 代表每一行数据
            String line;
            // 读取文件中每行数据至line,直到结束
            while ((line = reader.readLine()) != null) {
                // 将每一行数据转换为Person对象，注意数据的属性之间用\t分隔
                String[] array = line.split("\t");
                Person p = new Person();
                p.setId(Integer.parseInt(array[0]));
                p.setName(array[1]);
                p.setLocation(array[2]);
                p.setSex(array[3]);
                p.setBirth(Integer.parseInt(array[4]));
                p.setDeath(Integer.parseInt(array[5]));
                p.setForces(Integer.parseInt(array[6]));
                // 将每个Person对象放入list集合
                list.add(p);
            }
            return list;
        } catch (FileNotFoundException e) {
            throw new BizException("文件路径错误", e);
        } catch (IOException e) {
            throw new BizException("文件读写错误", e);
        }
    }
}
